# -*- coding: utf-8 -*-
# 接收到前面请求的任务后，进行处理，主要的处理类是whisperasr.py
# 这是进行asr处理的python程序，通过celery来进行任务的设置工作；
# 在此过程中，需要处理的的工作有几项：
# 1。通过GPU进行转码处理，转为两个码1080P和360P
# 2、进行音频的抽取工作
# 3、进行音频的声响分析工作，生成音量数据
# 4、对于音频进行ASR处理；
# 这几项工作，都是互相不影响，所以可以并行进行处理；

import datetime
from celery import Celery, current_task
import setting
import dbExcute
import requests
import os
from asrTask import asrTaskClass

broker = os.environ.get('BROKER')
backend = os.environ.get('BACKEND')
# asrurl = os.environ.get("ASRURL")
# timeout = int(os.environ.get("ASRTIMEOUT"))

class CustomError(Exception):
    pass
# 通过celery来实现异步任务的执行;
celeryAsrTask = Celery("celeryAsrTask", broker=broker, backend=backend)
# celeryAsrTask.conf.update(
#     worker_concurrency=4,
#     worker_pool='gevent',
# )
# celeryAsrTask.pool_cls = gevent

@celeryAsrTask.task(autoretry=False)
def asrTask(rjson):

    video = rjson["videopath"]
    enflag = rjson["en"]
    # 获取自身任务的ID
    uuid1 = current_task.request.id
    rjson["uuid1"] = uuid1
    tmd5 = rjson["tmd5"]

    # 处理时把任务的状态process 置为1 (新建的值0)
    dbExcute.setSubtitleTaskProcess('uuid1', uuid1, 1 ,1)
    dbExcute.addTaskLog(uuid1, "开始进行ASR处理")
    try:
        asrtask = asrTaskClass(video, tmd5, uuid1, enflag=False)
        result =  asrtask.Execute()

        # 设置任务完成100%
        dbExcute.setSubtitleTaskProcess('uuid1', uuid1 ,1, 100, 1)
        dbExcute.addTaskLog(uuid1, "ASR处理完成")
        return rjson
        
    except Exception as e:
        dbExcute.setSubtitleTaskProcess('uuid1', uuid1 ,1, 100, -1)
        dbExcute.addTaskLog(uuid1, f"处理错误,{str(e)[:100]}")
        return rjson

if __name__ == '__main__':
    celeryAsrTask.worker_main(['worker', '--loglevel', 'info', '--pool', 'solo', '--purge'])
    # 在此设定4个进程并发，是与后台的ASR的GPU并行能力相配合；
    # celeryAsrTask.worker_main(['worker', '--loglevel', 'info', '-c', 4])
